#include "cacelecenermetersingle.h"
#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDateTime>
#include <QList>
#include <QDebug>
#include <QString>
#include <QChar>
#include <math.h>

// 饿汉模式的关键：初始化即实例化
CACElecEnerMeterSingle *CACElecEnerMeterSingle::m_instanse=new CACElecEnerMeterSingle();

// 垃圾回收对象定义
CACElecEnerMeterSingle::GarbageCollector CACElecEnerMeterSingle::gc;

CACElecEnerMeterSingle::CACElecEnerMeterSingle(QObject *parent) : QSerialPort(parent)
{
    paraInit();
    connect(this,&CACElecEnerMeterSingle::readyRead,this,&CACElecEnerMeterSingle::dealRec);
}

CACElecEnerMeterSingle::CACElecEnerMeterSingle(const QSerialPortInfo &serialPortInfo, QObject *parent):QSerialPort(serialPortInfo,parent)
{
    paraInit();
    connect(this,&CACElecEnerMeterSingle::readyRead,this,&CACElecEnerMeterSingle::dealRec);
}

CACElecEnerMeterSingle::CACElecEnerMeterSingle(const QString &strPortName, QSerialPort::BaudRate baud, QObject *parent)
{
    this->setParent(parent);
    paraInit();
    this->setPortName(strPortName);
    this->setBaudRate(baud);
    connect(this,&CACElecEnerMeterSingle::readyRead,this,&CACElecEnerMeterSingle::dealRec);
}

void CACElecEnerMeterSingle::setSerialPara(const QString &strPortName, QSerialPort::BaudRate baud)
{
    this->setPortName(strPortName);
    this->setBaudRate(baud);
}

float CACElecEnerMeterSingle::getCurrentEner() const
{
    return _currentEner;
}

float CACElecEnerMeterSingle::getInitialEner() const
{
    return _initialEner;
}

void CACElecEnerMeterSingle::setInitialEner(float initialEner)
{
    _initialEner = initialEner;
}

float CACElecEnerMeterSingle::getAPowerFactor() const
{
    return _aPowerFactor;
}

float CACElecEnerMeterSingle::getBPowerFactor() const
{
    return _bPowerFactor;
}

float CACElecEnerMeterSingle::getCPowerFactor() const
{
    return _cPowerFactor;
}

float CACElecEnerMeterSingle::getAllPowerFactor() const
{
    return _allPowerFactor;
}

void CACElecEnerMeterSingle::paraInit()
{
    this->_currentEner=0.0f;
    this->_initialEner=0.0f;
    _aPowerFactor=0.0f; //A功率因数
}

void CACElecEnerMeterSingle::dealRec()
{
#if 0
    QByteArray text = QByteArray::fromHex("517420697320677265617421");
    qDebug()<<"fromHex"<<text.data(); // r
    qDebug()<<"fromHex"<<text; // r
    qDebug()<<"fromHex"<<QString::number(text[0],16)<<QString::number(text[1],16)<<text[2]<<text[3]; //

    QString str=text;
#endif

    //if(!this->canReadLine()) return;
    if(this->bytesAvailable()<50)  return;
    //读取串口数据
    QByteArray readComData = this->readAll();
    //将读到的数据显示到数据接收区
    if(readComData != NULL)
    {
        readComData=readComData.toHex().toUpper(); //转化为十六进制
        int fIndex=readComData.indexOf("91");
        qDebug()<<"fromHex"<<fIndex<<readComData; //得到24  处理成字符串
        if(fIndex==-1) return;
        if(readComData.count()-2-fIndex>9*2 && readComData.mid(fIndex+2,2)=="08" && readComData.mid(fIndex+4,2)=="33" && readComData.mid(fIndex+6,2)=="33" && readComData.mid(fIndex+8,2)=="34"&&readComData.mid(fIndex+10,2)=="33")
        {
            //电能报文FE FE FE FE 68 72 56 12 11 17 00 68 91 08 33 33 34 33 BB 44 33 33 9D 16  =》 33 33 34 33 7B 44 33 33 =（倒-33）  00 00 11 48 00 01 00 00=》能量11.48Kw
            //qDebug()<<tr("rec12222--------------------------------");
            QByteArray Data1=readComData.mid(fIndex+12,4*2);
            //qDebug()<<"enenr:"<<Data1<<Data1.count();  //7b443333
            QString str=Data1;
            for(int i=0;i<str.length();i++)
            {
                //判断 每个字符都是大于3的
                int num=str.mid(i,1).toInt(nullptr,16)-3;
                if(num < 0 || num > 9) return;
                str.replace(i,1,QString::number(num,10));
            }

            //qDebug()<<str<<str.length();
            //qDebug()<<QString::number(Data.at(0)-'3',10);
            _currentEner=str.mid(0,2).toInt()+str.mid(2,2).toInt()*100+str.mid(4,2).toInt()*10000+str.mid(6,2).toInt()*1000000;
            _currentEner/=100.0;
            qDebug()<<"enenr:"<<_currentEner;
        }
#if 1
        fIndex=readComData.indexOf("91",fIndex+1);
        qDebug()<<"fromHex"<<fIndex<<readComData; //得到24  处理成字符串
        if(fIndex==-1) return;
        if(readComData.count()-fIndex>14*2 && readComData.mid(fIndex+2,2)=="0C" && readComData.mid(fIndex+4,2)=="33" && readComData.mid(fIndex+6,2)=="32" && readComData.mid(fIndex+8,2)=="39"&&readComData.mid(fIndex+10,2)=="35")
        {
            //功率因数数 FE FE FE FE 68 73 00 00 00 15 20 68 91 0C 33 32 39 35 33 43 33 43 32 32 32 32 9C 16 =>
            QByteArray Data2=readComData.mid(fIndex+12,8*2); //33 43 33 43 32 32 32 32
            //QString strAll=QString::number(Data2.mid(2,2).toInt(nullptr,16)-0x33)+QString::number(Data2.mid(0,2).toInt(nullptr,16)-0x33);
            QString strAll=QString("%1").arg(Data2.mid(2,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'))+QString("%1").arg(Data2.mid(0,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'));
            _allPowerFactor=strAll.toFloat()/1000.0f;
            QString strA=QString("%1").arg(Data2.mid(6,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'))+QString("%1").arg(Data2.mid(4,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'));
            _aPowerFactor=strA.toFloat()/1000.0f;
            QString strB=QString("%1").arg(Data2.mid(10,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'))+QString("%1").arg(Data2.mid(8,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'));
            _bPowerFactor=strB.toFloat()/1000.0f;
            QString strC=QString("%1").arg(Data2.mid(14,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'))+QString("%1").arg(Data2.mid(12,2).toInt(nullptr,16)-0x33,2,16,QLatin1Char('0'));
            _cPowerFactor=strC.toFloat()/1000.0f;

            qDebug()<<"power:"<<_allPowerFactor<<_aPowerFactor<<_bPowerFactor<<_cPowerFactor;
        }
#endif

         emit signalGetReady(); //接受一次有效数据就发送一次信号
    }
    //清除缓冲区
    //readComData.clear();
}

/*
(1)  功率因数数据块
    FE FE FE FE 68 AA AA AA AA AA AA 68 11 04 33 32 39 35 B4 16
    FE FE FE FE 68 73 00 00 00 15 20 68 91 0C 33 32 39 35 33 43 33 43 32 32 32 32 9C 16    //48Byte
    解析：功能码33 32 39 35  ->02 06 FF 00  功率因数数据块
    33 43 ->10 00=1.000  总功率因素
    33 43 ->10 00=1.000  A功率因素
    32 32 ->ff ff=0               B功率因数
    32 32   B功率因数
(2) 读取电能
    FE FE FE FE 68 AA AA AA AA AA AA 68 11 04 33 33 34 33 AE 16
    FE FE FE FE 68 73 00 00 00 15 20 68 91 08 33 33 34 33 48 33 33 33 BF 16
    解析：33 33 34 33标识码  00 01 00 00：读取正向有功总能量（反向）
    33 33 34 33 7B 44 33 33 能量(-33)  00 00 11 48 00 01 00 00=》能量11.48Kw

(3) 读A相电流
    FE FE FE FE 68 AA AA AA AA AA AA 68 11 04 33 34 35 35 B2 16
    FE FE FE FE 68 73 00 00 00 15 20 68 91 07 33 34 35 35 33 33 33 7A 16
    解析：功能码33 34 35 35 ->02 02 01 00   A相电流
    33 33 33：->00 00 00=000.000 A
(4)  读A相电压：
    FE FE FE FE 68 AA AA AA AA AA AA 68 11 04 33 34 34 35 B1 16
    FE FE FE FE 68 73 00 00 00 15 20 68 91 06 33 34 34 35 6A 55 9E 16
    解析：功能码33 34 34 35->02 01 01 00      A相电压
    6A 55->22 37=223.7  V
(5)  瞬时A有功功率
    FE FE FE FE 68 AA AA AA AA AA AA 68 11 04 33 34 36 35 B3 16
    FE FE FE FE 68 73 00 00 00 15 20 68 91 07 33 34 36 35 33 33 33 7B 16  get_dianbiao_power
    解析：功能码33 34 36 35->02 03 01 00  瞬时A有功功率
     33 33 33->00 00 00 =00.0000kW
 *
 * ACSinglePhaseEnerMeter_RS485 ac = new ACSinglePhaseEnerMeter_RS485(2400, System.IO.Ports.Parity.Odd);
 * ac.PortName = "COM22";
 *
 *
int a=0001;

QString str = QString("%1").arg(a,4,10,QLatin1Char('0'));

***/
